home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / Prog / U-Z / 'Z' Basic 5.0x (ML) / zFormat ƒ / zFormat 11⁄29.bas next >
Encoding:
BASIC Source File  |  1991-12-07  |  20.6 KB  |  573 lines  |  [TEXT/ZBAS]

  1.     ' ZFormat©, 1991 Lininger Technology
  2.     
  3.     ' Written and Designed by
  4.     
  5.     '   Michael K. Lininger
  6.     '   Lininger Technology
  7.     ' 385 Bowling Green Place
  8.     '   Gahanna, Ohio 43230
  9.     
  10.     ' Dec 07, 1991  Version 1.0
  11.     
  12.     ' INTERNET: <Mike.Lininger@P21.F20.N226.Z1.FIDONET.ORG>
  13.     ' INTERNET: Mike.Lininger@cmhgate.fidonet.org
  14.     '      AOL: Michael86
  15.     '  FIDONET: 1:226/20.21
  16.     '  FIDONET: 1:322/115.6
  17.     
  18.     ' ZBasic 5.x Settings
  19.     ' Optimize Expressions as Integer (ON)
  20.     ' Space Required after Keywords   (ON)
  21.     ' Default Variable Type (INTEGER)
  22.     
  23.     
  24.     
  25.     
  26.     
  27.     DEF OPEN = "TEXTZBAS"                     :' Make sure reformated file is saved as a ZBASIC TYPE
  28.     BUNDLE = 1
  29.     WINDOW OFF:COORDINATE WINDOW
  30.     DEF MOUSE = -1:CURSOR 4:WIDTH -2
  31.     temp& = FN MAXMEM                        :' Purge leftover code
  32.     
  33.     DIM cursor%(50)                          :' Storage Area for acur resource
  34.     DIM T,L,B,R                              :' Generic rectangles
  35.     DIM My,Mx,GlobalY,GlobalX,LocalY,LocalX  :' Mouse points
  36.     DIM HighHook&,CaretHook&                 :' Assembly language hooks
  37.     
  38.     ' SFPPUT and SFPGET Record Structures
  39.     DIM SFGoodrCopy
  40.     DIM SFType&
  41.     DIM SFvRefNum
  42.     DIM SFversion
  43.     DIM 63 SFfName$
  44.     DIM whereY,whereX
  45.     DIM 255 prompt$
  46.     DIM 63 origName$
  47.     DIM numTypes
  48.     DIM fltrTp0&,fltrTp1&,fltrTp2&,fltrTp3&
  49.     
  50.     DIM 255 PBlock$                          :' Parameter Block Variable
  51.     DIM ScrnT,ScrnL,ScrnB,ScrnR              :' Rect of main screen
  52.     
  53.     ' Record Structure for FN SYSENVIRONS()
  54.     DIM EnvVersion,MachineType,SystemVersion,Processor
  55.     DIM HasFPU,KeyBoardType,AtDrvrVersNum,SysVRefNum
  56.     
  57.     DIM KeyRecord(7) :' Record structure for keyboard map
  58.     
  59.     ' Check to see if we are working in the Environment or with a true application
  60.     PHndl& = FN GETRESOURCE(CVI("zFLT"),0)
  61.     LONG IF PHndl& = 0
  62.         ResRef = FN OPENRESFILE("ZFormat.res")        :' We are in the Environment, use resource file
  63.     XELSE
  64.         ' We are working with an application, use its resources
  65.         ' Find the real name of our application
  66.         CurApName = &H910
  67.         CurApName$ = ""
  68.         FOR I% = 1 TO PEEK(CurApName)
  69.             CurApName$ = CurApName$ + CHR$(PEEK(CurApName+I%))
  70.         NEXT I%
  71.         ResRef = FN OPENRESFILE(CurApName$)           : ' Open the file, if we write rscs back out
  72.     END IF
  73.     IF PHndl& <> 0 THEN CALL RELEASERESOURCE(PHndl&) :' Close loose Handle
  74.     Errnum% = FN RESERROR                            :' Flush any Resource Errors Values
  75.     
  76.     DEFSTR LONG
  77.     
  78.     ' Store Important ZBasic Registers to use as a base line for MACHine Patches
  79.     POKE LONG &A78,REGISTER(A5)
  80.     POKE LONG &A7C,REGISTER(A6)
  81.     
  82.     dlogHook& = LINE "Dialog_Hook"
  83.     
  84.     SysVolRef = PEEK WORD(528)                      :' This is VolRef for inside the system folder
  85.     
  86.     LONG FN OptionDown                              :' Returns True(-1) if option key is down
  87.         CALL GETKEYS(KeyRecord(0))
  88.     END FN=FN BITTST(VARPTR(KeyRecord(3)),13)
  89.     
  90.     
  91.     LONG FN ColorMode
  92.         
  93.         ' Function to determine if this is a color machine and what color depth
  94.         
  95.         ' ROM85 = &H028E
  96.         ' RomTypeW& = -1    FOR 128K OR 512K
  97.         ' RomTypeW& = 32767 FOR PLUS OR SE
  98.         ' RomTypeW& = 16383 FOR ][
  99.         
  100.         ROM85& = &H028E
  101.         RomTypeW& = PEEK WORD(ROM85&)
  102.         
  103.         ' TheGDevice = &H0CC8
  104.         ' gdMode& = 128 FOR   2 B&W OR COLORS
  105.         ' gdMode& = 129 FOR   4 B&W OR COLORS
  106.         ' gdMode& = 130 FOR  16 B&W OR COLORS
  107.         ' gdMode& = 131 FOR 256 B&W OR COLORS
  108.         
  109.         TheGDevice&=&H0CC8
  110.         GDHandle&=PEEK LONG(TheGDevice&)
  111.         GDPtr&=PEEK LONG(GDHandle&)
  112.         gdMode&=PEEK LONG(GDPtr&+42)
  113.         
  114.         ' GET THE B&W/COLOR MODE
  115.         
  116.         IF gdMode& = 128 THEN ColorMode% = 2
  117.         IF gdMode& = 129 THEN ColorMode% = 4
  118.         IF gdMode& = 130 THEN ColorMode% = 16
  119.         IF gdMode& = 131 THEN ColorMode% = 256
  120.         IF RomTypeW& <>16383 THEN ColorMode% = 2
  121.         
  122.         LONG IF (HasFPU AND 1) AND (ColorMode% > 2)
  123.             ColorQD = ColorMode%                          :' We have color
  124.         XELSE
  125.             ColorQD = 0                                   :' Color is not present
  126.         END IF
  127.         
  128.     END FN = ColorQD
  129.     
  130.     
  131.     LONG FN CursorShow(standardCur%)                    :' Check to see if color is available
  132.         LONG IF FN ColorMode > 2                         :' Check to see if color is available
  133.             CCrsrHandle& = FN GETCCURSOR(standardCur%)    :' Get handle to color cursor resource
  134.             LONG IF CCrsrHandle& > 0                      :' If color cursor resource found use it
  135.                 CALL SETCCURSOR(CCrsrHandle&)              :' Display color cursor CCrsrHandle&
  136.                 CALL DISPOSCCURSOR(CCrsrHandle&)           :' Dispose of the handle CCrsrHandle&
  137.             XELSE
  138.                 CURSOR standardCur%                        :' Display normal B/W cursor
  139.             END IF
  140.         XELSE
  141.             CURSOR standardCur%                           :' No Color, display normal B/W cursor
  142.         END IF
  143.     END FN
  144.     
  145.     
  146.     LONG FN CursorSpin
  147.         
  148.         ' This function animates the cursor, when you are within loops for for/next events
  149.         ' Cur% is the offset with the acur that points to the next cursor in the animation sequence
  150.         ' cursor%(0) is the Number of "Frames" cursors of the acur resource
  151.         ' cursor%(1) is the 'used a "Frame' Counter of the acur resource
  152.         ' cursor%(2,4,6,8...) *even #'ed positions are actual cursor resource numbers
  153.         ' cursor%(3,5,7,9...) *odd #'ed postions are not used, buffered area for acur resource
  154.         
  155.         LONG IF cursor_Delay% > cursor%(1)                :' only animate cursor if our delay is > than
  156.             cursor_Delay% = 0                              :' Reset our delay counter to 0
  157.             Cur% = Cur% + 2                                :' Odd numbers are no good so we inc+ by 2
  158.             LONG IF Cur% > cursor%(0) * 2                  :' Check to see if beyond Max Frames
  159.                 Cur% = 2                                    :' Reset to beginning frame cursor%(2)
  160.             END IF
  161.             LONG IF FN ColorMode > 2
  162.                 CCrsrHandle& = FN GETCCURSOR(cursor%(Cur%)) :' Get handle to color cursor resource
  163.                 LONG IF CCrsrHandle& > 0                    :' If color cursor resource found use it
  164.                     CALL SETCCURSOR(CCrsrHandle&)            :' Display color cursor CCrsrHandle&
  165.                     CALL DISPOSCCURSOR(CCrsrHandle&)         :' Dispose of the handle CCrsrHandle&
  166.                 XELSE
  167.                     CURSOR cursor%(Cur%)                     :' Display normal B/W cursor
  168.                 END IF
  169.             XELSE
  170.                 CURSOR cursor%(Cur%)                        :' No Color, display normal B/W cursor
  171.             END IF
  172.         END IF
  173.         cursor_Delay% = cursor_Delay% + 1                 :' Inc+ our internal delay by 1
  174.     END FN
  175.     
  176.     
  177.     LONG FN ProgressBar(barT,barL,barB,barR,percentComplete&,totalPercent&,pattern%)
  178.         
  179.         ' This function builds and updates our own progress bar.
  180.         
  181.         LONG IF barT > barB OR barR < barL OR percentComplete& > totalPercent& OR percentComplete& < 0
  182.             Err = 1: ' problem with the values being passed do not draw or overflow error will happen
  183.         XELSE
  184.             Err = 0: ' Values passed the test, we may now update the progress bar
  185.         END IF
  186.         
  187.         LONG IF Err = 0
  188.             COLOR 0                                           :' Set color to white
  189.             LONG IF percentComplete& <= 1
  190.                 PEN ,,,,19
  191.                 BOX FILL barT-4,barL-4 TO barB+4,barR+4        :' Draw a white filled box
  192.             END IF
  193.             COLOR -1                                          :' Set color to black
  194.             PEN ,,,,0
  195.             BOX barT-2,barL-2 TO barB+2,barR+2                :' Draw a black outlined box
  196.             Distance% = barB - barT
  197.             XDraw# = Distance%/totalPercent&
  198.             DrawTo% = (percentComplete& * XDraw#) + barT
  199.             COLOR 2                                           :' Set color to green/black 2bit macs
  200.             PEN ,,,,pattern%
  201.             IF percentComplete& > 1 THEN BOX FILL barT,barL TO DrawTo%,barR
  202.             COLOR -1
  203.         END IF
  204.     END FN
  205.     
  206.     
  207.     LONG FN RTRIM$(temp$)
  208.         
  209.         ' Strip trailing blanks CHR$(32)'s and low control characters from a string variable
  210.         ' Modified to strip any character with an ASC value less than 32
  211.         
  212.         DO
  213.             a% = ASC(RIGHT$(temp$,1))
  214.             IF a% <= 32 THEN temp$=LEFT$(temp$,LEN(temp$)-1)
  215.         UNTIL a% > 32 OR LEN(temp$) <= 1
  216.         
  217.         IF temp$ = " " THEN temp$ = ""
  218.         
  219.     END FN = temp$
  220.     
  221.     
  222.     LONG FN LTRIM$(temp$)
  223.         
  224.         ' Strip leading blanks CHR$(32)'s and low control characters from a string variable
  225.         ' Modified to strip any character with an ASC value less than 32
  226.         
  227.         DO
  228.             a% = ASC(LEFT$(temp$,1))
  229.             IF a% <= 32 THEN temp$ = RIGHT$(temp$,LEN(temp$)-1)
  230.         UNTIL a% > 32 OR LEN(temp$) <= 1
  231.         
  232.         IF temp$ = " " THEN temp$ = ""
  233.         
  234.     END FN = temp$
  235.     
  236.     
  237. "Program_Start"
  238.     
  239.     ' Determine system environment we will be working with
  240.     OSErr% = FN SYSENVIRONS(1,VARPTR(EnvVersion))
  241.     
  242.     fproc& = 0
  243.     dID% = 4000
  244.     whereY = 50
  245.     whereX = 80
  246.     numTypes = 1
  247.     customDialogStyle% = 0
  248.     prompt$ = ""
  249.     fltrTp0& = CVI("TEXT")
  250.     
  251.     ' Setup and call our own custom SFPGET dialog box
  252.     CALL SFPGETFILE(whereY,prompt$,0,numTypes,fltrTp0&,dlogHook&,SFGoodrCopy,dID%,fproc&)
  253.     
  254.     ' Append " new" to the end of the file we selected to reformat
  255.     nName2$ = SFfName$ + " new"
  256.     
  257.     LONG IF LEN(SFfName$) > 0 AND SFGoodrCopy <> 0            :' Make sure we got a good file name
  258.         
  259.         tm& = TIMER                                            :' Get time so we can monitor seconds later
  260.         TEXT 0,12,0,0                                          :' Define TEXT as System Chicago 12
  261.         bWnd% = 105                                            :' Bottom pixel location of window
  262.         IF showLine% <> 0 THEN bWnd% = bWnd% + 40              :' Add 40 pixels if you will show data in window
  263.         WINDOW 8,"ZCode Format",(10,40)-(285,bWnd%),261        :' Open the Window
  264.         
  265.         H& = FN GETRESOURCE(CVI("acur"),128)                   :' Get handle to our acur resource
  266.         LONG IF FN RESERROR = 0 AND H& > 0                     :' If a acur resource was found
  267.             BLOCKMOVE PEEK LONG(H&),VARPTR(cursor%(0)),2
  268.             x% = (cursor%(0) * 4) + 4                           :' Check to see that we don't excede
  269.             IF x% > 46 THEN x% = 50                             :' our limit of up to 23 cursors per
  270.             BLOCKMOVE PEEK LONG(H&),VARPTR(cursor%(0)),x%       :' animation sequence + 2 control locations
  271.         XELSE                                                  :' acur resource was not found, build our own
  272.             x% = 140                                            :' build our own acur being with cur 140
  273.             cursor%(1) = 7                                      :' Lets make the animation frames 7 long
  274.             cursor%(0) = 2                                      :' set 2 calls per frame displayed
  275.             FOR j% = 2 TO 18 STEP 2
  276.                 cursor%(j%) = x%
  277.                 x% = x% + 1
  278.             NEXT j%
  279.         END IF
  280.         IF H& > 0 THEN CALL RELEASERESOURCE(H&)                :' Release handle to acur resource
  281.         Cur% = 2
  282.         
  283.         OPEN "I",1,SFfName$,,SFvRefNum                         :' Open original file
  284.         OPEN "O",2,nName2$,,SFvRefNum                          :' Open our new reformated file
  285.         
  286.         addTab% = 0
  287.         TabCnt% = 1                                            :' Default to 1 leading Tab
  288.         break% = 0
  289.         removeLine% = 0
  290.         
  291.         fileBytes& = LOF(1,1)
  292.         processedBytes& = 0
  293.         FN ProgressBar(22,28,241,36,100,100,19)                :' Draw empty progress bar
  294.         
  295.         
  296.         ON ERROR GOSUB 65535                                   :' Set error to our control for speed
  297.         
  298.         ON DIALOG GOSUB "Dialog"
  299.         DIALOG ON
  300.         DO                                                     :' Do until there is no more data in file
  301.             DIALOG OFF
  302.             
  303.             LONG IF FN OptionDown
  304.                 break% = -1                                      :' Holding down Option key will break
  305.             END IF                                              :' terminate to program
  306.             :' Update progress bar
  307.             FN ProgressBar(22,28,241,36,processedBytes&,fileBytes&,3)
  308.             FN CursorSpin                                       :' Animate cursor
  309.             
  310.             LINE INPUT #1,a$                                    :' Get a line of data from original file
  311.             processedBytes& = processedBytes& + LEN(a$) + 1     :' Count bytes for progress bar
  312.             lineCount% = lineCount% + 1                         :' Keep track of lines processed
  313.             
  314.             a$ = FN LTRIM$(a$)                                  :' Remove all leading controls and spaces
  315.             a$ = FN RTRIM$(a$)                                  :' Remove all trailing controls and spaces
  316.             addTab% = 0
  317.             
  318.             ' Determine if line should be tab'ed IN or tab'ed OUT
  319.             IF LEFT$(a$,2)  = "DO"        THEN addTab% = 1:GOTO "break_Point"
  320.             IF LEFT$(a$,5)  = "WHILE"     THEN addTab% = 1:GOTO "break_Point"
  321.             IF LEFT$(a$,2)  = "IF"        THEN addTab% = 1:GOTO "break_Point"
  322.             IF LEFT$(a$,6)  = "SELECT"    THEN addTab% = 2:GOTO "break_Point"
  323.             
  324.             ' CASE statements have to handled in a special way to maintain tabing levels
  325.             LONG IF LEFT$(a$,4) = "CASE"
  326.                 addTab% = 1
  327.                 TabCnt% = TabCnt% - 1
  328.                 GOTO "break_Point"
  329.             END IF
  330.             
  331.             IF LEFT$(a$,7)  = "LONG FN"    THEN addTab% = 1:GOTO "break_Point"
  332.             IF LEFT$(a$,3)  = "FOR"        THEN addTab% = 1:GOTO "break_Point"
  333.             IF LEFT$(a$,7)  = "LONG IF"    THEN addTab% = 1:GOTO "break_Point"
  334.             
  335.             IF LEFT$(a$,5)  = "XELSE"      THEN addTab% = 1:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  336.             IF LEFT$(a$,5)  = "UNTIL"      THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  337.             IF LEFT$(a$,4)  = "LOOP"       THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  338.             IF LEFT$(a$,4)  = "WEND"       THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  339.             IF LEFT$(a$,6)  = "END IF"     THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  340.             IF LEFT$(a$,10) = "END SELECT" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  341.             IF LEFT$(a$,6)  = "END FN"     THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  342.             IF LEFT$(a$,4)  = "NEXT"       THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
  343.             
  344. "break_Point"
  345.             ' Break Point label so you we can jump here by-passing other checks that are not needed
  346.             ' This is bad, never, ever do a GOTO, except here it is OK.  The above could be done with
  347.             ' the CASE statements to avoid the GOTO
  348.             
  349.             IF LEFT$(a$,2)  = "DO"    AND INSTR(1,a$,"UNTIL") > 2 THEN addTab% = 0
  350.             IF LEFT$(a$,2)  = "IF"    AND INSTR(1,a$,"THEN ") > 2 THEN addTab% = 0
  351.             IF LEFT$(a$,3)  = "FOR"   AND INSTR(1,a$,"NEXT") > 3  THEN addTab% = 0
  352.             IF LEFT$(a$,5)  = "WHILE" AND INSTR(1,a$,"UNTIL") > 5 THEN addTab% = 0
  353.             
  354. "break_Point2"
  355.             ' Break Point2 label so you we can jump here by-passing other checks that are not needed
  356.             ' This is bad, never, ever do a GOTO, except here it is OK.  The above could be done with
  357.             ' the CASE statements to avoid the GOTO
  358.             
  359.             ' We have to deal with an END SELECT in a special way to maintain tabing levels
  360.             LONG IF LEFT$(a$,10) = "END SELECT"
  361.                 TabCnt% = TabCnt% - 1
  362.             END IF
  363.             
  364.             ' Just a check to make sure we don't Zero or Negative Tab somewhere in the Twilight Zone
  365.             IF TabCnt% < 1 THEN TabCnt% = 1
  366.             
  367.             ' Check to see if we should filter FULL line REMARK statements
  368.             ' We will filter the following
  369.             '     any line that starts with a  '
  370.             '     any line that starts with the word REM
  371.             '     any line that starts with a  :'
  372.             LONG IF remDelete% <> 0
  373.                 IF LEFT$(a$,1) = "'" OR LEFT$(a$,3) = "REM" OR LEFT$(a$,2) = ":'" THEN removeLine% = 1 ELSE removeLine% = 0
  374.             END IF
  375.             
  376.             ' If REM line NOT found then lets write the line back out to reformatted file
  377.             LONG IF removeLine% = 0
  378.                 title% = 0
  379.                 IF ASC(LEFT$(a$,1)) = 34 OR LEFT$(a$,7) = "SEGMENT" THEN title% = 1 ELSE title% = 0 :' Check for a line label
  380.                 LONG IF title% = 0
  381.                     FOR j% = 1 TO TabCnt%
  382.                         PRINT #2,CHR$(9);                             :' Insert the appropiate number of TAB's
  383.                     NEXT j%
  384.                     PRINT #2, a$                                     :' Print the line to reformatted file
  385.                 XELSE
  386.                     PRINT #2,a$                                      :' Print label line to reformatted file
  387.                     addTab% = 0
  388.                 END IF
  389.                 IF addTab% > 0 THEN TabCnt% = TabCnt% + addTab% :' Update # of Tabs
  390.                 addTab% = 0
  391.             END IF
  392.             
  393.             ' Check to see if we need to show the line just processed
  394.             LONG IF showLine% <> 0
  395.                 T=65:L=5:B=94:R=280
  396.                 CALL TEXTBOX(VARPTR(a$)+1,LEN(a$),T,0)
  397.             END IF
  398.             
  399.             ' Check to see if we need to show the current # of lines processed along with time
  400.             LONG IF showLineCnt% <> 0
  401.                 T=43:L=105:B=57:R=293
  402.                 temp$ = STR$(lineCount%) + "   " +STR$(TIMER-tm&)+" secs "
  403.                 CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
  404.             END IF
  405.             
  406.             ' Check the like and make a special note if it is a CASE statement line, used above
  407.             IF LEFT$(a$,4) = "CASE" THEN lastcas% = 1 ELSE lastcas% = 0
  408.             
  409.         UNTIL EOF(1) OR break% = -1
  410.         
  411.         FN ProgressBar(22,28,241,36,100,100,0)          :' Draw progress bar at 100% complete
  412.         FN CursorShow(Arrow)                            :' Set Cursor to standard ARROW
  413.         FN ProgressBar(22,28,241,36,100,100,19)         :' Reset progress bar (EMPTY)
  414.         
  415.         CLOSE #1                                        :' Close our original file
  416.         CLOSE #2                                        :' Close our remormatted file
  417.         WINDOW CLOSE #8                                 :' Close working Window
  418.         IF ResRef > 0 THEN CALL CLOSERESFILE(ResRef)    :' Release our handle to our appl resources
  419.     END IF
  420.     ON ERROR RETURN                                    :' Return Error control to ZBASIC
  421.     END                                                :' Terminate program
  422.     
  423.     
  424. "Dialog"
  425.     
  426.     ' Check for event passed to our application
  427.     d% = DIALOG(0)
  428.     d1% = DIALOG(d%)
  429.     
  430.     LONG IF d% = 5
  431.         GOSUB "Format_wnd"                              :' We an a window refresh request, lets do it
  432.     END IF
  433.     
  434.     RETURN
  435.     
  436.     
  437. "Format_wnd"
  438.     
  439.     ' ReDraw poritions of window that were erased or hidden now that we
  440.     ' are back on TOP.
  441.     
  442.     T=6:L=22:B=20:R=293
  443.     temp$ = "File: "
  444.     CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
  445.     
  446.     temp$ = SFfName$
  447.     T=6:L=62:B=20:R=293
  448.     CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
  449.     
  450.     LONG IF showLineCnt% <> 0
  451.         T=43:L=22:B=57:R=293
  452.         temp$ = "Line Count:"
  453.         CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
  454.         
  455.         T=43:L=105:B=57:R=293
  456.         temp$ = STR$(lineCount%) + "   " +STR$(TIMER-tm&)+" secs "
  457.         CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
  458.     END IF
  459.     
  460.     RETURN
  461.     
  462.     
  463.     
  464. "Dialog_Hook"
  465.     
  466.     ' This routine is from
  467.     
  468.     ' Ariel Publishing Inc.
  469.     ' P.O. Box 398
  470.     ' Pateros, WA  98846-0398
  471.     ' (509) 923-2249
  472.     ' Inside Basic (Journal of Macintosh BASIC programming)
  473.     ' Volume 1, No.6  Pages 13-19
  474.     
  475.     ' This is the entry point for the hook.
  476.     
  477.     MACHLG &2039,&0000,&0A78                :' MOVE.L   $A78,D0
  478.     MACHLG &23CD,&0000,&0A78                :' MOVE.L   A5,$A78
  479.     MACHLG &2A40                            :' MOVEA.L  D0,A5
  480.     MACHLG &2039,&0000,&0A7C                :' MOVE.L   $A7C,D0
  481.     MACHLG &23CE,&0000,&0A7C                :' MOVE.L   A6,$A7C
  482.     MACHLG &2C40                            :' MOVEA.L  D0,A6
  483.     
  484.     returnAddr& = PEEK LONG(REGISTER(A7))   :' Get the return address from the stack
  485.     REGISTER(A7) = REGISTER(A7) + 4         :' Adjust the stack pointer
  486.     theDialogPtr& = PEEK LONG(REGISTER(A7)) :' Get the first parameter (the dialog
  487.     :' pointer) from the stack.
  488.     REGISTER(A7) = REGISTER(A7) + 4         :' Adjust the stack pointer
  489.     theItem = PEEK WORD(REGISTER(A7))       :' Get the item number from the stack
  490.     REGISTER(A7) = REGISTER(A7) + 2         :' Adjust the stack pointer
  491.     :'
  492.     :' Now push all registers on to the stack
  493.     :' so that we can put everything back
  494.     :' like it was when we exit.
  495.     :'
  496.     MACHLG &48E7,&FFFC                      :' MOVEM.L D0-D7/A0-A5,-(SP)
  497.     
  498.     :' This is the real routine
  499.     
  500.     
  501.     ' This is return action for dialog hook
  502.     ' Monitor and toggle check boxes
  503.     SELECT theItem
  504.         CASE 11,12,13
  505.             CALL GETDITEM(theDialogPtr&,theItem,theType,theHndl&,T)
  506.             LONG IF FN GETCTLVALUE(theHndl&) = 0
  507.                 CALL SETCTLVALUE(theHndl&,1)
  508.             XELSE
  509.                 CALL SETCTLVALUE(theHndl&,0)
  510.             END IF
  511.             theItem = 100
  512.         CASE ELSE
  513.     END SELECT
  514.     
  515.     LONG IF theItem = 14
  516.         GOSUB "About"  :' Wow, we got someone to click on the about icon, lets brag
  517.         theItem = 100
  518.     END IF
  519.     
  520.     
  521.     LONG IF theItem = 1
  522.         
  523.         ' Get final settings we got a select from the user...
  524.         CALL GETDITEM(theDialogPtr&,11,theType,theHndl&,T)
  525.         showLine% =  FN GETCTLVALUE(theHndl&)         :' Should we show lines as they are processed?
  526.         
  527.         CALL GETDITEM(theDialogPtr&,12,theType,theHndl&,T)
  528.         showLineCnt% =  FN GETCTLVALUE(theHndl&)      :' Should we show # of lines processed and time?
  529.         
  530.         CALL GETDITEM(theDialogPtr&,13,theType,theHndl&,T)
  531.         remDelete% =  FN GETCTLVALUE(theHndl&)        :' Should we delete full REM lines?
  532.         
  533.     END IF
  534.     
  535.     :' Having completed this routine we
  536.     :' need to put things back where we
  537.     :' found them.  First we restore the
  538.     :' registers.
  539.     :'
  540.     MACHLG &4CDF,&3FFF                      :' MOVEM.L (SP)+,D0-D7/A0-A5
  541.     REGISTER(D1) = theItem                  :' Push the return address back on the stack
  542.     MACHLG &3E81                            :' MOVE.W D1,(SP)
  543.     REGISTER(D1) = returnAddr&              :' Push the return address back on top
  544.     :' Do the appScratch shuffle.
  545.     MACHLG &2F01                            :' MOVE.L   D1,-(SP)
  546.     MACHLG &2039,&0000,&0A78                :' MOVE.L   $A78,D0
  547.     MACHLG &23CD,&0000,&0A78                :' MOVE.L   A5,$A78
  548.     MACHLG &2A40                            :' MOVEA.L  D0,A5
  549.     MACHLG &2039,&0000,&0A7C                :' MOVE.L   $A7C,D0
  550.     MACHLG &23CE,&0000,&0A7C                :' MOVE.L   A6,$A7C
  551.     MACHLG &2C40                            :' MOVEA.L  D0,A6
  552.     
  553.     ' This is one HELL of a USEFULL, GREAT, FANTASTIC routine - Thanks Ariel Publishing
  554.     
  555.     RETURN
  556.     
  557.     
  558. "About"
  559.     
  560.     FN CursorShow(Arrow)
  561.     
  562.     ' Get the handle to our about dialog and display it
  563.     x& = FN GETNEWDIALOG(1000,0,-1)
  564.     CALL MODALDIALOG(0,x%)
  565.     FN CursorShow(Arrow)
  566.     CALL DISPOSDIALOG(x&)
  567.     
  568.     RETURN
  569.     
  570.     
  571.     
  572.     
  573.